import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
import seaborn as sns

pd.set_option('display.max_rows', None, 'display.max_columns', None, 'display.max_colwidth', 1000)
spr = 2
spc = 2
spn = 0
plt.figure(figsize=[16, 8])


def sep(label=''):
    """Utility function to print a separator line."""
    print('-' * 32, label, '-' * 32, sep='')


# 对hour.csv数据进行如下操作：
# 1、	读取数据信息（5分）
df = pd.read_csv(r'../../../../../large_data/共享单车/hour.csv')

# 2、	打印前5行信息（5分）
sep('打印前5行信息')
print(df.head(5))

# 3、	打印数据信息（5分）
sep('打印数据信息')
print(df.info())

# 4、	打印数据描述（5分）
sep('打印数据描述')
print(df.describe())

# 5、	判定instant是否是索引列（10分）
sep('判定instant是否是索引列')
print(df.index.name == 'instant')

# 6、	将所有连续特征和标签cnt比较皮尔逊系数并用热图显示（10分）
sep('将所有连续特征和标签cnt比较皮尔逊系数并用热图显示')
x = df[['temp', 'atemp', 'hum', 'windspeed', 'casual', 'registered', 'cnt']]
xcorr = x.corr()
print(xcorr)
spn += 1
plt.subplot(spr, spc, spn)
sns.heatmap(xcorr, annot=True)

# 7、	删除掉认为没有的特征（5分）
del df['atemp']
del df['casual']
del df['registered']

# 8、	对离散特征进行独热编码处理（10分）
df = pd.get_dummies(df, columns=['season', 'holiday', 'weekday', 'workingday', 'weathersit'])

# 9、	使用标准化处理连续特征（10分）
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
xstd = scaler.fit_transform(df[['temp', 'hum', 'windspeed']])

# 10、	删除掉处理前的连续特征（5分）
df[['temp', 'hum', 'windspeed']] = xstd
print(df.head())

# 11、	将数据切分为x，y，使用留出法切分7:3（10分）
del df['dteday']
x = df.iloc[:, :-1]
y = df.iloc[:, -1]
from sklearn.model_selection import train_test_split
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.7, random_state=666)

# 12、	创建线性回归，进行模型的预测处理（10分）
from sklearn.linear_model import LinearRegression
model = LinearRegression()
model.fit(x_train, y_train)

# 13、	打印mse，mae，r方（10分）
from sklearn.metrics import mean_squared_error, mean_absolute_error, r2_score
h_test = model.predict(x_test)
print(f'mse = {mean_squared_error(y_test, h_test)}')
print(f'mae = {mean_absolute_error(y_test, h_test)}')
print(f'r2 = {r2_score(y_test, h_test)}')
